#include<stdio.h>
int main()
{
    int n, sz, sz_space;
    scanf("%d", &n);
    sz = n + 1;
    sz_space = (sz - 1) * 2;
    int arr[100] = { 0 };
    arr[0] = 1;
    for (int i = 0; i < sz; i++) {
        for (int m = 0; m < sz_space; m++)
            printf(" ");
        printf("1");
        for (int j = i; j > 0; j--)
            arr[j] += arr[j - 1];
        for (int j = 1; j <= i; j++)
            printf("%4d", arr[j]);
        printf("\n");
        sz_space -= 2;
    }
    return 0;
}
//设计思路：
// 利用一维数组存储每行的内容，数组首元素为1，其它元素为该行对应下标+1位置上的值，
// 如arr[1]为该行第2个值，每次换行后以arr[j] += arr[j-1]进行调整，
// 注意在调整时使用逆循环，否则将影响后续值的调整，而逆序调整，正序打印则不受影响。
//最前面的空格数为（n + 1）* 2，行数+1，空格数-2;除arr[0]外，其余值均向右对齐，占4个空格大小输出。